package com.yjz.leetcode.求某个文件路径下的最大文件大小的前n个文件的全路径;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.springframework.util.StringUtils;

import java.io.File;
import java.util.*;

/**
 * @author :yuanJinZhong
 * @description:求指定路径下的文件大小排名前n个的文件,排序这块使用冒泡排序或者选择排序
 * @date :2018/7/31-19:36
 */
@Slf4j
public class FindFullDirSolution {

  static long maxSize = 0;
  static File maxFile = null;

  @Test
  public void test1() {
    String path = "D:\\code_practice";

    /*列出所有文件*/
    List<String> list = solution(path);
    log.info("列表为:{}", list);

    /*找出最大文件*/
    findNthItem(list);
    log.info("最大的文件为:{},文件大小为:{}M", maxFile, maxFile.length() / (1024 * 1024));

    /*找出前3个最大的文件*/
    List<String> sortedList = filerSort(list, 3);
    log.info("前3个最大文件的列表为:{}", sortedList);
  }

  /**
   * @param path :指定目录
   * @return :存放文件的全路径的列表
   * @description:调用{@code recursionFindFile}, 获取指定目录下的所有文件
   * @author :yuanJinZhong
   * @date :2018/8/1-8:53
   */
  public List<String> solution(String path) {
    File file = new File(path);
    /**
     * 存放所有文件路径的全局容器
     */
    List overallList = new ArrayList<>();

    List<String> list = recursionFindFile(file, overallList);

    return list;
  }


  /**
   * @param file:文件
   * @param list:存放文件全路径的全局容器
   * @return
   * @description:递归列举出指定文件下的所有文件
   * @author :yuanJinZhong
   * @date :2018/8/1-8:51
   */
  public List<String> recursionFindFile(File file, List list) {
    if (file.exists()) {
      if (file.isDirectory()) {
        File[] fileArr = file.listFiles();
        for (File file1 : fileArr) {
          recursionFindFile(file1, list);
        }
      } else {
        list.add(file.getPath());
      }
    }
    return list;
  }

  /**
   * @param fileList ： 存放文件全路径的列表
   * @return
   * @description:从一堆文件中找出最大的文件
   * @author :yuanJinZhong
   * @date :2018/8/1-18:28
   */
  public List<String> findNthItem(List<String> fileList) {
    for (String s : fileList) {
      File file = new File(s);
      /*选择排序变种，找出最大的文件*/
      if (file.length() > maxSize) {
        maxSize = file.length();
        maxFile = file;
      }
    }
    return fileList;
  }

  /**
   * @param list 文件列表
   * @param n    取前n个文件
   * @return
   * @description:对文件列表按大小进行排序
   * @author :yuanJinZhong
   * @date :2018/8/6-10:45
   */
  public List<String> filerSort(List<String> list, int n) {
    if (StringUtils.isEmpty(list) || list.size() == 0) {
      throw new RuntimeException("列表大小为空,不进行排序");
    } else {
      String[] fileArr = new String[list.size()];
      list.toArray(fileArr);

      /*冒泡排序*/
      for (int i = 0; i < fileArr.length - 1; i++) {
        for (int j = 0; j < fileArr.length - 1 - i; j++) {
          /*若前面的比后面的小,则交换顺序(将后面大的交换到前面)*/
          if (new File(fileArr[j]).length() < new File(fileArr[j + 1]).length()) {
            String temp = fileArr[j + 1];
            fileArr[j + 1] = fileArr[j];
            fileArr[j] = temp;
          }
        }
      }
      return Arrays.asList(fileArr).subList(0, n);
    }
  }


  /**
   * @description:linkListTest
   * @author :yuanJinZhong
   * @date :2018/8/1-9:38
   */
  @Test
  public void linkListTest() {
    List<Integer> list = new LinkedList<>();
    list.add(1);
    list.add(2);
    log.info(list + "");
  }


}
